package Shifu.MainServer.Management;

import java.util.HashMap;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.io.Serializable;

/**
 * @class FileTable tabella dei file presenti sulla rete tramite hashtable i cui gli hash di un file sono le chiavi
 * @author vr069316
 */

public class FileTable implements Serializable {

	/* campi */

	/* HashMap generale */

	private HashMap map;

	private int key = 0;	

	/* costruttore */
	public FileTable() {
		this.map = new HashMap();
	}

	/**
	 * Inserisce un nuovo record nella tabella
	 * @param r il record da inserire
	 */

	public void insert(Record r) {
		map.put(key,r);
		System.out.println("FileTable: File : "+r.getFileName()+" all indice : "+key);
		r.setKeyPosition(key);
		key++;
	}

	/**
	 * Indica se c'è una daterminata chiave
	 * @param index chiave
	 * @return true se c'è
	 */

	public boolean thereIsFile(int index) {
		return map.containsKey(index);
	}


	/**
	 * Ritorna idex-esimo record
	 * @param index indice del record
	 * @return il record richiesto
	 */

	public Record get(int index) {
		System.out.println("FileTable: Recupero File all' indice : "+index);
		return (Record) map.get(index);	
	}

	/**
	 * Indica la dimensione della tabella
	 * @return dimensione della tablella
	 */

	public int size() {
		return map.size();	
	}

	/**
	 * Rimuove un determinato record
	 * @param index indice del record da eliminare
	 */

	public void delete(int index) {
		map.remove(index);
		System.out.println("FileTable: Rimozione File all' indice : "+index);
	}


	/**
	 * Rimuove un peer da tutti i file presenti nella tabella
	 * @param peer il peer da eliminare
	 */

	public void removePeerTable(Peer peer) {

		System.out.println("FileTable: rimozione da tutti i chunk del peer: "+peer.getId());
		Collection col = new ArrayList();
		col = map.values();

		Iterator it = col.iterator();

		//Scansiona tutti i record
		while(it.hasNext()) {
			Record rec = (Record) it.next();
			FileChunkedDescriptor cfd = rec.getFcd();
			cfd.removePeerFile(peer);
		}
	}

	/**
	 * Stampa tutti i valori presenti nella tabella
	 */

	public void printAll() {
		//Viene restituita una lista	
		Collection col = new ArrayList();
		col = map.values();
		int i=0;
		//Creazione iteratore
		Iterator it = col.iterator();
		while(it.hasNext()) {
			Record val = (Record) it.next();
			//ToString xogni elemento
			System.out.println(i+":"+val.toString());
			i++;	
		}		
	}



	/**
	 * Genera un stringa che descrive lo stato della tabella
	 * @return la stringa
	 */

	public String toString() {
		//Viene restituita una lista	
		Collection col = new ArrayList();
		col = map.values();
		String string = "";
		//Creazione iteratore
		Iterator it = col.iterator();
		while(it.hasNext()) {
			Record val = (Record) it.next();
			//ToString xogni elemento
			string += val.smallString();	
		}
		/* Elenco di tutti i file presenti sulla rete */
		return string;		
	}	
} 
